#include <iostream>
#include <cstdlib>
#include <string>
//#include <memory>
using namespace std;

//int main()
//{

//    int *p = new int(10);
//    auto_ptr<int>pa(p);
//    cout <<*pa <<endl;
//    string* s = new string("hellow");
//    auto_ptr<string> pal(s);
//    cout << pal->size() << endl;

//    cout << "Hello World!" << endl;
//    return 0;
//}


template<class _Ty>
class auto_ptr1
{
public:
    auto_ptr1(_Ty* _P): _owns(_P!=0),_ptr(_P){

        cout << "构造函数"<< endl;
    }

~auto_ptr1()
    {
        if(_owns)
        {
            delete _ptr;
        _ptr = NULL;}
        cout << " 析构" << endl;
    }
private:
    bool _owns;
    _Ty* _ptr;
public:
    _Ty& operator*() const
    {
        return *_ptr;
    }
    _Ty* operator->() const
    {
        return _ptr;
    }
};
class Test
{
public:
  void fun()
  {
      cout << "print Test" << endl;
  }
};

int main()
{
  int *p = new int(10);
  auto_ptr1<int> pa(p);
  cout << *pa <<endl;
  Test *q = new Test();
  q->fun();
  auto_ptr1<Test> pb(q);
  pb->fun();
}
